package com.cloudpark.common.util;

import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class TimeUtil {
    /**
     * 获取当前年份
     */
    public static int getYear() {
        GregorianCalendar g = new GregorianCalendar();
        int year = (int) g.get(Calendar.YEAR);
        return year;
    }

    /**
     * 获取当前周数 星期一到星期日为一周 先获得指定日期 星期一的日期 然后根据星期一的日期判断周数
     * 
     * @param args
     */
    public static int getWeekOfYear(String reportDate) {
        int n = 0;
        Date date = TimeUtil.strToDate(getMondayDate(reportDate));
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        n = cal.get(cal.WEEK_OF_YEAR);
        return n;
    }

    /**
     * 根据一个日期，返回是星期几的字符串
     * 
     * @param sdate
     * @return
     */
    public static String getWeek(String reportDate) {
        Date date = TimeUtil.strToDate(reportDate);
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        // int hour=c.get(Calendar.DAY_OF_WEEK);
        // hour中存的就是星期几了，其范围 1~7
        // 1=星期日 7=星期六，其他类推
        return new SimpleDateFormat("EEEE").format(c.getTime());
    }

    /**
     * 输入指定日期前N天的日期
     * */
    public static String getBeforeDay(String strdate, int n) {
        Date date = null;
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            date = sf.parse(strdate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

        cal.add(Calendar.DATE, -n);
        return sf.format(cal.getTime());

    }

    /**
     * 输入指定日期前N天的日期
     * */
    public static String getBeforeDayT(String strdate, int n) {
        Date date = null;
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        try {
            date = sf.parse(strdate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

        cal.add(Calendar.DATE, -n);
        return sf.format(cal.getTime());

    }

    /**
     * 获取当天时间
     */
    public static String getNowDate(String dateformat) {
        Date now = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat(dateformat);// 可以方便地修改日期格式
        String dateStr = dateFormat.format(now);
        return dateStr;
    }

    /**
     * 将短时间格式字符串转换为日期 yyyy-MM-dd
     * 
     * @param strDate
     * @return
     */
    public static Date strToDate(String strDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(strDate, pos);
        return strtodate;
    }

    /**
     * 将短时间格式字符串转换为时间 yyyy-MM-dd
     * 
     * @param strDate
     * @return
     */
    public static Date strToTime(String strDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(strDate, pos);
        return strtodate;
    }

    /**
     * 获取当月第一天
     */
    public static String getFirstDayOfMonth() {
        String str = "";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar lastDate = Calendar.getInstance();
        lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
        str = sdf.format(lastDate.getTime());
        return str;
    }

    /**
     * 获取输入日期的第一天 格式为"2010-08-01"
     * 
     * @param args
     */
    public static String getFirstDayOfMonthByString(String reportDate) {
        return reportDate.substring(0, 8) + "01";
    }

    /**
     * 获取N月前当天的日期
     */
    public static String getPreviousMonth(int n) {
        String str = "";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar lastDate = Calendar.getInstance();
        lastDate.add(Calendar.MONTH, -n);// 减一个月
        str = sdf.format(lastDate.getTime());
        return str;
    }
    
    /**
     * 获取N月后当天的日期
     */
    public static String getNextMonth(int n) {
        String str = "";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar lastDate = Calendar.getInstance();
        lastDate.add(Calendar.MONTH, n);// 加一个月
        str = sdf.format(lastDate.getTime());
        return str;
    }

    /**
     * 获取指定日期N月后的日期
     */
    public static String getNextMonth(String strdate, int n) {
    	 String str = "";
    	 Date date = null;
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         try {
             date = sdf.parse(strdate);
         } catch (ParseException e) {
             e.printStackTrace();
         }
         Calendar cal = Calendar.getInstance();
         cal.setTime(date);
         cal.add(Calendar.MONTH, n);// 加一个月
        str = sdf.format(cal.getTime());
        return str;
    }
    
    /**
     * 获得前N月最后一天的日期
     */
    public static String getPreviousMonthEnd(int n) {
        String str = "";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar lastDate = Calendar.getInstance();
        lastDate.add(Calendar.MONTH, -n);// 减一个月
        lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
        lastDate.roll(Calendar.DATE, -1);// 日期回滚一天，也就是本月最后一天
        str = sdf.format(lastDate.getTime());
        return str;
    }

    /**
     * 获得输入日期前N月最后一天的日期
     */
    public static String getPreviousMonthEnd(String date, int n) {
        String str = "";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date inDate = null;
        Calendar lastDate = Calendar.getInstance();
        try {
            inDate = sdf.parse(date);
            lastDate.setTime(inDate);
        } catch (ParseException e) {
        }

        lastDate.add(Calendar.MONTH, -n);// 减一个月
        lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
        lastDate.roll(Calendar.DATE, -1);// 日期回滚一天，也就是本月最后一天
        str = sdf.format(lastDate.getTime());
        return str;
    }

    /**
     * 获取指定周一日期(星期一到星期日为一周)
     * */
    public static String getMondayDate(String strdate) {
        int len = 0;
        Date date = null;
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            date = sf.parse(strdate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int dayOfWeek = cal.get(cal.DAY_OF_WEEK);// 当天是本周的第几天
        if (dayOfWeek == 1) {
            len = 6;
        } else {
            len = dayOfWeek - 2;
        }
        cal.add(Calendar.DATE, -len);
        return sf.format(cal.getTime());
    }

    /**
     * 获取输入日期 是哪年的第几周
     * 
     * @param date
     * @return
     */
    public static Integer getYearByDate(String date) {
        String date6 = TimeUtil.getBeforeDay(TimeUtil.getMondayDate(date), -5);
        Integer year = Integer.parseInt(date6.substring(0, 4));
        return year;
    }

    /**
     * 得到二个日期间的间隔天数 参数 （大，小）
     */
    public static String getTwoDay(String sj1, String sj2) {
        SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
        long day = 0;
        try {
            java.util.Date date = myFormatter.parse(sj1);
            java.util.Date mydate = myFormatter.parse(sj2);
            day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
        } catch (Exception e) {
            return "";
        }
        return day + "";
    }

    /**
     * 获取未来N天的时间
     * 
     * @Title getNdaysFuture
     * @Description TODO(用一句话描述该方法做什么)
     * @param N
     * @return Date
     * @author TangAiBo
     * @date 2015-5-26 下午05:18:27
     */
    public static Date getNdaysFuture(int N, Date date) {
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(s.format(date));
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DATE, N);
        return c.getTime();
        // String str2=s.format(c.getTime());
        // System.out.println("30天后的时间是："+str2);
    }

    public static void main(String[] args) {
        System.out.println("获取当前年份：" + getYear());
        System.out.println("获取当前周数：" + getWeekOfYear("2010-08-15"));
        System.out.println("输入指定日期前N天的日期：" + getBeforeDay("2016-09-29", 7));
        System.out.println("获取当天日期:" + getNowDate("yyyy-MM-dd HH:mm:ss"));
        System.out.println("获取本月第一天日期:" + getFirstDayOfMonth());
        System.out.println("获取输入月第一天日期:" + getFirstDayOfMonthByString("2009-05-07"));
        System.out.println("获得前N月当天日期 " + getPreviousMonth(1));
        System.out.println("获得后N月当天日期 " + getNextMonth(1));
        System.out.println("获得后N月当天日期 " + getNextMonth("2017-09-09", 1));
        System.out.println("获得前N月最后一天的日期 " + getPreviousMonthEnd(1));
        System.out.println("获得指定日期星期一的日期：" + getMondayDate("2010-09-13"));
        System.out.println("获取输入日期 是哪年的第几周:" + getYearByDate("2009-12-28"));
    }
}
